مشاهده تاریخچه کامیتها
پس از ایجاد چندین کامیت یا کلون کردن یک مخزن با تاریخچه موجود، احتمالاً میخواهید به تاریخچه نگاه کنید. ابزار اصلی برای این کار، دستور git log
است.
این مثالها از یک پروژه ساده به نام "simplegit" استفاده میکنند. برای دریافت پروژه، فرمان زیر را اجرا کنید:
$ git clone https://github.com/schacon/simplegit-progit
زمانی که دستور git log
را در این پروژه اجرا کنید، خروجی مشابه زیر را دریافت میکنید:
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
Remove unnecessary test
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
Initial commit
به طور پیش فرض، بدون هیچ آرگومانی، git log
کامیتهای موجود در آن مخزن را به ترتیب معکوس زمانی نمایش میدهد؛ یعنی جدیدترین کامییتها ابتدا نمایش داده میشوند. همان طور که میبینید، این دستور هر کامیت را با هش SHA-1، نام و ایمیل نویسنده، تاریخ و پیام کامیت فهرست میکند.
گزینهها و تنوع زیادی برای دستور git log
وجود دارد که به شما کمک میکند دقیقا آنچه را که به دنبال آن هستید پیدا کنید. یکی از گزینههای مفید، -p
یا --patch
است که تفاوتها(خروجی patch)ایجاد شده در هر کامیت را نمایش میدهد. همچنین میتوانید تعداد ورودیهای لاگ نمایش داده شده را محدود کنید، مثلا با استفاده از -2 که فقط دو ورودی آخر را نشان میدهد.
$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = "simplegit"
- s.version = "0.1.0"
+ s.version = "0.1.1"
s.author = "Scott Chacon"
s.email = "schacon@gee-mail.com"
s.summary = "A simple gem for using Git in Ruby code."
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
Remove unnecessary test
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index a0a60ae..47c6340 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -18,8 +18,3 @@ class SimpleGit
end
end
-
-if $0 == __FILE__
- git = SimpleGit.new
- puts git.show
-end
این گزینه همان اطلاعات را نمایش میدهد، اما با تفاوتهای که بهطور مستقیم پس از هر ورودی قرار دارد. این امر برای باز بینی کد یا مرور سریع آنچه در طول یک سری کامیتهایی که یک همکار اضافه کرده، بسییار مفید است. همچنین میتوانید از مجموعهای از گزینههای خلاصهسازی با دستور git log
استفاده کنید. به عنوان مثال، اگر بخواهید آمار مختصری از هر کامیت مشاهده کنید، میتوانید از گزینه --stat
استفاده کنید:
$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
Rakefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
Remove unnecessary test
lib/simplegit.rb | 5 -----
1 file changed, 5 deletions(-)
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
Initial commit
README | 6 ++++++
Rakefile | 23 +++++++++++++++++++++++
lib/simplegit.rb | 25 +++++++++++++++++++++++++
3 files changed, 54 insertions(+)
همان طور که مشاهده میکنید، گزینه --stat
زیر هر ورودی کامیت، فهرستی از فایلهای اصلاح شده، حذف شده در آن فایلها را چاپ میکند. همچنین، خلاصهای از اطلاعات را در انتها ارائه میدهد.
گزینه دیگری که واقعاً مفید است، --pretty
است. این گزینه خروجی لاگ را به فرمتهای دیگری غیر از فرمت پیش فرض تغییر میدهد. چندین مقدار پیش ساخته برای این گزینه در دسترس است. مقدار one live برای این گزینه هر کامیت را در یک خط نمایش میدهد که برای مرور تعداد زیادی کامیت بسیار کاربردی است. علاوه بر این، مقادیر short و full و fuller خروجی را تقریبا در همان فرمت اما با اطلاعات کمتر یا بیشتر، به ترتیب، نشان میدهند:
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 Change version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Remove unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 Initial commit
گزینه format در git log
به شما این امکان را میدهد که فرمت خروجی لاگ را به دلخواه خود تعیین کنید. این ویژگی به خصوص زمانی مفید است که میخواهید خروجی را برای پردازش ماشین تولید کنید؛ زیرا با تعیین صریح فرمت، اطمینان دارید که خروجی با به روزرسانیهای گیت تغییر نخواهد کرد. این امر باعث میشود که بتوانید به راحتی خروجی را در برنامهها یا اسکریپتهای خود استفاده کنید و از ثبات آن مطمئن باشید.
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : Change version number
085bb3b - Scott Chacon, 6 years ago : Remove unnecessary test
a11bef0 - Scott Chacon, 6 years ago : Initial commit
دستور git log --pretty=format
گزینههای مختلفی برای فرمت کردن خروجی لاگهای گیت ارائه میدهد.
جدول۱. دستورهای مفید برای git log --pretty=format
Specifier | Description |
---|---|
%H | Commit hash |
%h | Abbreviated commit hash |
%T | Tree hash |
%t | Abbreviated tree hash |
%P | Parent hashes |
%p | Abbreviated parent hashes |
%an | Author name |
%ae | Author email |
%ad | Author date (format respects the --date=option) |
%ar | Author date, relative |
%cn | Committer name |
%ce | Committer email |
%cd | Committer date |
%cr | Committer date, relative |
%s | Subject |
شاید برایتان جالب باشد که تفاوت بین نویسنده و کامیتکننده چیست. نویسنده کسی است که بهطور اولیه اثر را نوشته، در حالی که کامیتکننده شخصی است که آخرین بار کار را اعمال کرده است. بنابراین، اگر شما یک پچ به یک پروژه ارسال کنید و یکی از اضای اصلی آن پچ را اعمال کند، هم شما و هم آن عضو اعتبار دریافت میکند - شما به عنوان نویسنده و آن عضو به کامیت کننده. در مورد این تفاوت بیشتر در بخش گیت توزیع شده بحث خواهیم کرد.
مقادیر گزینههای oneline
و format
به ویژه با گزینه دیگری از لاگ به نام --graph
بسیار مفید هستند. این گزینه یک تمودار ASCII کوچک و زیبا اضافه میکند که تاریخچه برنچ و ادغامهای شما را نشان میدهد.
$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 Ignore errors from SIGCHLD on trap* 5e3ee11 Merge branch 'master' of https://github.com/dustin/grit.git
|\
| * 420eac9 Add method for getting the current branch
* | 30e367c Timeout code and tests
* | 5a09431 Add timeout protection to grit
* | e1193f8 Support for heads with slashes in them
|/
* d6016bc Require time for xmlschema
* 11d191e Merge branch 'defunkt' into local
این نوع خروجی با ادامه مباحث مربوط به برنچسازی و ادغام در فصل بعد جالبتر خواهد شد.
اینها تنها برخی از گزینههای ساده برای فرمتدهی خروجی در git log
هستند و گزینههای بیشتری نیز وجود دارد. بخش "گزینه های رایج برای git log
" شامل گزینههایی است که تاکنون بررسی کردهایم و همچنین برخی دیگر از گزینههای رایج فرمتدهی که ممکن است مفید باشند، به همراه توضیحاتی درباره نحوه تغییر خروجی دستور لاگ است.
جدول 2. گزینه های رایج برای git log
Option | Description |
---|---|
-p | Show the patch introduced with each commit. |
--stat | Show statistics for files modified in each commit. |
--shortstat | Display only the changed/insertions/deletions line from the --stat command. |
--name-only | Show the list of files modified after the commit information. |
--name-status | Show the list of files affected with added/modified/deleted information. |
--abbrev-commit | Show only the first few characters of the SHA-1 checksum instead of all 40. |
--relative-date | Display the date in a relative format (e.g., "2 weeks ago") instead of the full date format. |
--graph | Display an ASCII graph of the branch and merge history beside the log output. |
--pretty | Show commits in an alternate format. Option values include oneline , short , full , fuller , and format . |
--oneline | Shorthand for --pretty=oneline --abbrev-commit used together. |